<?php
header ( 'Content-type:text/html;charset=utf-8' );
date_default_timezone_set('PRC');
 include_once '../sdk/acp_service.php';
 include_once '../ZZYMessage/Message.php';

/**
* 重要：联调测试时请仔细阅读注释！
* 
* 产品：代收产品<br>
* 交易：代收：后台资金类交易，有同步应答和后台通知应答<br>
* 日期： 2017-07<br>
* 版本： 1.0.0
* 版权： 中国银联<br>
* 说明：以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己需要，按照技术文档编写。该代码仅供参考，不提供编码性能规范性等方面的保障<br>
* 该接口参考文档位置：open.unionpay.com帮助中心 下载  产品接口规范  《代收产品接口规范》<br>
*《平台接入接口规范-第5部分-附录》（内包含应答码接口规范）<br>
* 测试过程中的如果遇到疑问或问题您可以：1）优先在open平台中查找答案：
* 							        调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案
*                             测试过程中产生的7位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案
*                         2） 咨询在线人工支持： open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”，咨询人工QQ测试支持。
* 确定交易成功机制：商户必须开发后台通知接口和交易状态查询接口（Form09_6_5_Query）确定交易是否成功，建议发起查询交易的机制：可查询N次（不超过6次），每次时间间隔2N秒发起,即间隔1，2，4，8，16，32S查询（查询到03，04，05继续查询，否则终止查询）
*/
$logger = com\unionpay\acp\sdk\LogUtil::getLogger();
if(!isset($_POST["orderId"]) || !isset($_POST["payMonth"]) || !isset($_POST["txnAmt"]) || !isset($_POST["accNo"]) || !isset($_POST["accName"])){
	$logger->LogInfo ( $_POST["orderId"]."代收缺少参数。" );
	$message = new com\unionpay\acp\message\Message(['accountsid'=>"8126c72e85ea153f086b513c002ac2af",'token'=>"dd01e7ef6ba384b0438099c15f776909"]);
	$RandParam=$_POST["orderId"].",".'代收失败';
	$message -> SendSms('67b509eb875242c3a1bfcfcc895ef29a','309743',$RandParam,"15334509852",0);
	return;
}
$maxtxnAmt=5000;
switch($_POST["accName"]){
	case "中国工商银行":
		$maxtxnAmt=1000000;
		break;
	case "中国农业银行":
		$maxtxnAmt=200000;
		break;
	case "中国银行":
		$maxtxnAmt=1000000;
		break;
	case "中国建设银行":
		$maxtxnAmt=1000000;
		break;
	case "中国交通银行":
		$maxtxnAmt=1000000;
		break;
	case "中国邮政银行":
		$maxtxnAmt=500000;
		break;
	case "中国光大银行":
		$maxtxnAmt=1000000;
		break;
	case "中国中信银行":
		$maxtxnAmt=500000;
		break;
	case "中国浦发银行":
		$maxtxnAmt=1000000;
		break;
	case "中国兴业银行":
		$maxtxnAmt=1000000;
		break;
	case "中国上海银行":
		$maxtxnAmt=500000;
		break;
	case "中国平安银行":
		$maxtxnAmt=500000;
		break;
	default:
		$maxtxnAmt=500000;
		break;
}
if($_POST["txnAmt"]>$maxtxnAmt){
	$txnAmt=$_POST["txnAmt"];
	$index=0;
	while($txnAmt>$maxtxnAmt){
		$params = array(
		
				//以下信息非特殊情况不需要改动
				'version' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,		      //版本号
				'encoding' => 'utf-8',		      //编码方式
				'signMethod' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,		      //签名方法
				'txnType' => '11',		          //交易类型	
				'txnSubType' => '02',		      //交易子类
				'bizType' => '000501',		      //业务类型
				'accessType' => '0',		      //接入类型
				'channelType' => '07',		      //渠道类型
				'currencyCode' => '156',          //交易币种，境内商户勿改
				'backUrl' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl, //后台通知地址	
				'encryptCertId' => com\unionpay\acp\sdk\AcpService::getEncryptCertId(), //验签证书序列号
				
				//TODO 以下信息需要填写
				'merId' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->merId,		//商户代码，请改自己的测试商户号，此处默认取demo演示页面传递的参数
				'orderId' => $_POST["orderId"].date('YmdHis',time()+$index).$_POST["payMonth"],	//商户订单号，8-32位数字字母，不能含“-”或“_”，此处默认取demo演示页面传递的参数，可以自行定制规则
				'txnTime' => date('YmdHis'),	//订单发送时间，格式为YYYYMMDDhhmmss，取北京时间，此处默认取demo演示页面传递的参数
				'txnAmt' => $maxtxnAmt,	//交易金额，单位分，此处默认取demo演示页面传递的参数

				//'accNo' => $accNo,     //卡号，敏感信息不加密方式
				'accNo' => com\unionpay\acp\sdk\AcpService::encryptData($_POST["accNo"]),     //卡号，敏感信息加密方式

				// 请求方保留域，
				// 透传字段，查询、通知、对账文件中均会原样出现，如有需要请启用并修改自己希望透传的数据。
				// 出现部分特殊字符时可能影响解析，请按下面建议的方式填写：
				// 1. 如果能确定内容不会出现&={}[]"'等符号时，可以直接填写数据，建议的方法如下。
				//    'reqReserved' =>'透传信息1|透传信息2|透传信息3',
				// 2. 内容可能出现&={}[]"'符号时：
				// 1) 如果需要对账文件里能显示，可将字符替换成全角＆＝｛｝【】“‘字符（自己写代码，此处不演示）；
				// 2) 如果对账文件没有显示要求，可做一下base64（如下）。
				//    注意控制数据长度，实际传输的数据长度不能超过1024位。
				//    查询、通知等接口解析时使用base64_decode解base64后再对数据做后续解析。
				//    'reqReserved' => base64_encode('任意格式的信息都可以'),
		);
		sendPay( $params );
		$txnAmt-=$maxtxnAmt;
		$index+=1;
	}
	if($txnAmt>0){
		$params = array(
		
				//以下信息非特殊情况不需要改动
				'version' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,		      //版本号
				'encoding' => 'utf-8',		      //编码方式
				'signMethod' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,		      //签名方法
				'txnType' => '11',		          //交易类型	
				'txnSubType' => '02',		      //交易子类
				'bizType' => '000501',		      //业务类型
				'accessType' => '0',		      //接入类型
				'channelType' => '07',		      //渠道类型
				'currencyCode' => '156',          //交易币种，境内商户勿改
				'backUrl' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl, //后台通知地址	
				'encryptCertId' => com\unionpay\acp\sdk\AcpService::getEncryptCertId(), //验签证书序列号
				
				//TODO 以下信息需要填写
				'merId' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->merId,		//商户代码，请改自己的测试商户号，此处默认取demo演示页面传递的参数
				'orderId' => $_POST["orderId"].date('YmdHis',time()+$index).$_POST["payMonth"],	//商户订单号，8-32位数字字母，不能含“-”或“_”，此处默认取demo演示页面传递的参数，可以自行定制规则
				'txnTime' => date('YmdHis'),	//订单发送时间，格式为YYYYMMDDhhmmss，取北京时间，此处默认取demo演示页面传递的参数
				'txnAmt' => $txnAmt,	//交易金额，单位分，此处默认取demo演示页面传递的参数

				//'accNo' => $accNo,     //卡号，敏感信息不加密方式
				'accNo' => com\unionpay\acp\sdk\AcpService::encryptData($_POST["accNo"]),     //卡号，敏感信息加密方式

				// 请求方保留域，
				// 透传字段，查询、通知、对账文件中均会原样出现，如有需要请启用并修改自己希望透传的数据。
				// 出现部分特殊字符时可能影响解析，请按下面建议的方式填写：
				// 1. 如果能确定内容不会出现&={}[]"'等符号时，可以直接填写数据，建议的方法如下。
				//    'reqReserved' =>'透传信息1|透传信息2|透传信息3',
				// 2. 内容可能出现&={}[]"'符号时：
				// 1) 如果需要对账文件里能显示，可将字符替换成全角＆＝｛｝【】“‘字符（自己写代码，此处不演示）；
				// 2) 如果对账文件没有显示要求，可做一下base64（如下）。
				//    注意控制数据长度，实际传输的数据长度不能超过1024位。
				//    查询、通知等接口解析时使用base64_decode解base64后再对数据做后续解析。
				//    'reqReserved' => base64_encode('任意格式的信息都可以'),
		);
		sendPay( $params );
	}
}else{
	$params = array(
		
			//以下信息非特殊情况不需要改动
			'version' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,		      //版本号
			'encoding' => 'utf-8',		      //编码方式
			'signMethod' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,		      //签名方法
			'txnType' => '11',		          //交易类型	
			'txnSubType' => '02',		      //交易子类
			'bizType' => '000501',		      //业务类型
			'accessType' => '0',		      //接入类型
			'channelType' => '07',		      //渠道类型
			'currencyCode' => '156',          //交易币种，境内商户勿改
			'backUrl' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl, //后台通知地址	
			'encryptCertId' => com\unionpay\acp\sdk\AcpService::getEncryptCertId(), //验签证书序列号
			
			//TODO 以下信息需要填写
			'merId' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->merId,		//商户代码，请改自己的测试商户号，此处默认取demo演示页面传递的参数
			'orderId' => $_POST["orderId"].date('YmdHis').$_POST["payMonth"],	//商户订单号，8-32位数字字母，不能含“-”或“_”，此处默认取demo演示页面传递的参数，可以自行定制规则
			'txnTime' => date('YmdHis'),	//订单发送时间，格式为YYYYMMDDhhmmss，取北京时间，此处默认取demo演示页面传递的参数
			'txnAmt' => $_POST["txnAmt"],	//交易金额，单位分，此处默认取demo演示页面传递的参数

			//'accNo' => $accNo,     //卡号，敏感信息不加密方式
			'accNo' => com\unionpay\acp\sdk\AcpService::encryptData($_POST["accNo"]),     //卡号，敏感信息加密方式

			// 请求方保留域，
			// 透传字段，查询、通知、对账文件中均会原样出现，如有需要请启用并修改自己希望透传的数据。
			// 出现部分特殊字符时可能影响解析，请按下面建议的方式填写：
			// 1. 如果能确定内容不会出现&={}[]"'等符号时，可以直接填写数据，建议的方法如下。
			//    'reqReserved' =>'透传信息1|透传信息2|透传信息3',
			// 2. 内容可能出现&={}[]"'符号时：
			// 1) 如果需要对账文件里能显示，可将字符替换成全角＆＝｛｝【】“‘字符（自己写代码，此处不演示）；
			// 2) 如果对账文件没有显示要求，可做一下base64（如下）。
			//    注意控制数据长度，实际传输的数据长度不能超过1024位。
			//    查询、通知等接口解析时使用base64_decode解base64后再对数据做后续解析。
			//    'reqReserved' => base64_encode('任意格式的信息都可以'),
	);
	 sendPay( $params );
}





function sendPay( $param ){
	$logger = com\unionpay\acp\sdk\LogUtil::getLogger();
	com\unionpay\acp\sdk\AcpService::sign ( $param ); // 签名
	$url = com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backTransUrl;
	$logger->LogInfo ( $_POST["orderId"]."代收" );
	$result_arr = com\unionpay\acp\sdk\AcpService::post ( $param, $url );
		
	if(count($result_arr)<=0) { //没收到200应答的情况
		$message = new com\unionpay\acp\message\Message(['accountsid'=>"8126c72e85ea153f086b513c002ac2af",'token'=>"dd01e7ef6ba384b0438099c15f776909"]);
		$RandParam=$_POST["orderId"].",".'代收失败';
		$message -> SendSms('67b509eb875242c3a1bfcfcc895ef29a','309743',$RandParam,"15334509852",0);
		return;
	}


	if (!com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
		$logger->LogInfo ( $_POST["orderId"]."代收应答报文验签失败" );
		$message = new com\unionpay\acp\message\Message(['accountsid'=>"8126c72e85ea153f086b513c002ac2af",'token'=>"dd01e7ef6ba384b0438099c15f776909"]);
		$RandParam=$_POST["orderId"].",".'代收失败';
		$message -> SendSms('67b509eb875242c3a1bfcfcc895ef29a','309743',$RandParam,"15334509852",0);
		return;
	}
	$logger->LogInfo ( $_POST["orderId"]."代收应答报文验签成功");
	if ($result_arr["respCode"] == "00"){
		//交易已受理，等待接收后台通知更新订单状态，如果通知长时间未收到也可发起交易状态查询
		//TODO
		$logger->LogInfo ( "代收受理成功" . $_POST["orderId"]);
	} else if ($result_arr["respCode"] == "03"
			|| $result_arr["respCode"] == "04"
			|| $result_arr["respCode"] == "05" ){
		//后续需发起交易状态查询交易确定交易状态
		//TODO
		$logger->LogInfo ( $_POST["orderId"]."代收处理超时，请稍后查询。" );
		$message = new com\unionpay\acp\message\Message(['accountsid'=>"8126c72e85ea153f086b513c002ac2af",'token'=>"dd01e7ef6ba384b0438099c15f776909"]);
		$RandParam=$_POST["orderId"].",".'代收失败';
		$message -> SendSms('67b509eb875242c3a1bfcfcc895ef29a','309743',$RandParam,"15334509852",0);
	} else {
		//其他应答码做以失败处理
		//TODO
		$logger->LogInfo ( $_POST["orderId"]."代收受理失败：" . $result_arr["respMsg"]);
		$message = new com\unionpay\acp\message\Message(['accountsid'=>"8126c72e85ea153f086b513c002ac2af",'token'=>"dd01e7ef6ba384b0438099c15f776909"]);
		$RandParam=$_POST["orderId"].",".'代收失败';
		$message -> SendSms('67b509eb875242c3a1bfcfcc895ef29a','309743',$RandParam,"15334509852",0);
	}
}

